package com.arpa.wms.service;

import com.arpa.core.web.Result;
import com.arpa.wms.domain.dto.DeliveryDTO;
import com.arpa.wms.domain.dto.DeliveryDistributionDTO;
import com.arpa.wms.domain.dto.PickingDTO;
import com.arpa.wms.domain.entity.Delivery;
import com.arpa.wms.domain.entity.Picking;
import com.arpa.wms.domain.entity.PickingItem;
import com.arpa.wms.domain.entity.PickingRegister;
import com.arpa.wms.domain.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 拣货单 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface IPickingService extends IService<Picking> {

    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    boolean save(Picking entity);

    /**
     * 根据code更新实体
     * @param entity
     * @return
     */
    int updateByCode(Picking entity);

    /**
     * 查询列表
     * @param pickingDTO
     * @return
     */
    List<PickingVO> queryList(PickingDTO pickingDTO);

    /**
     * 查询合计,包含总数
     * @param pickingDTO
     * @return
     */
    PickingVO queryListSum(PickingDTO pickingDTO);

    /**
     * 查询合计,包含总数
     * @param pickingDTO
     * @return
     */
    PickingVO queryListTotal(PickingDTO pickingDTO);

    /**
     * @description
     * 整单上架确认时更新明细中的缺货信息，同时返还分配的库存，并锁定
     * @author xuyang
     * @date 2020/10/23 9:39
     * @param stockoutInfo:
     **/
    Result updateItemForCheck(Picking picking, Map<PickingItem, BigDecimal> stockoutInfo);

    /**
     * @description
     * 获取关联明细表的主单信息
     * @author xuyang
     * @date 2020/10/27 15:05
     * @param code:
     **/
    PickingVO getVoByCode(String code);

    /**
     * @description
     * 获取关联明细表的主单信息
     * @author xuyang
     * @date 2020/10/27 15:05
     * @param code:
     **/
    PickingVO getVoByCodeWithAllItem(String code,String groupCode);

    PickingVO getVoWithRegisterByCode(String code);

    PickingVO getRegisterByCodeForPrint(String code);

    /**
     * 更新拣货单下发状态
     * @param code 拣货单标识
     */
    void updateIssueStatus(String code, String groupCode);

     /**
      *  @author: Allen chen
      *  @Date: 2020/10/21 17:30
      *  @Description: 获取任务明细信息
      */
    PickingTaskDetailVO getTaskDetailByCode(PickingDTO pickingDTO);

    /**
     * @description
     * PDA拣货确认（针对单个明细确认）
     * @author xuyang
     * @date 2020/10/26 8:41
     * @param pickingCode:
     * @param pickingItemCode:
     * @param unFinishRegisterCode:
     * @param pickingQuantity:
     * @param containerBarCode:
     * @param goodsBarCode:
     * @param pn:
     **/
    PdaSwitchPageVO singleCheck(String pickingCode, String pickingItemCode, String unFinishRegisterCode, BigDecimal pickingQuantity, String containerBarCode, boolean isBatch,
                                String goodsBarCode,String pn);

    /**
     * @description
     * 尝试更新主单状态，试探明细是否完成拣货
     * @author xuyang
     * @date 2020/10/26 10:41
     * @param pickingCode:
     * @param value:
     **/
    int updateStatusIfFinish(String pickingCode, String value);

    /**
     * @description
     * PDA缺货登记
     * @author xuyang
     * @date 2020/10/26 13:39
     * @param :
     **/
    PdaSwitchPageVO stockout(String pickingCode, String pickingItemCode, BigDecimal stockoutQuantity);

    /**
     * PC端批量确认拣货单
     * @param pickingCode
     * @param isStockout
     * @return
     */
    void PcBatchCheck(String pickingCode, boolean isStockout);

    /**
     * 拣货确认后的操作
     * @param pickingCode
     * @return
     */
    Result afterFinishPicking(String pickingCode);

    /**
     * 根据波次号和库存code查询发货分配信息
     * @param query
     * @return
     */
    List<DeliveryDistributionVO> queryDistributionsByInventoryCodeAndWavePickingCode(DeliveryDistributionDTO query);

    /**
     * 批量保存拣货单、拣货明细、拣货确认单
     * @param pickings
     */
    void batchSavePickingAndItemAndRegisters(List<Picking> pickings);

    /**
     * 通过拣货确认单信息更新拣货单信息
     * @param wavePickingCode
     */
    int updatePickingByPickingRegister(String wavePickingCode);

    /**
     * 批量获取拣货单详情
     * @param pickingCodes
     */
    List<PickingVO> batchGetVOWithRegisterByCode(List<String> pickingCodes);

    /**
     * 查询各订单标识对应的任务数量
     */
    List<PickingVO> queryTaskQuantityGroupByOrderTag();

    /**
     * 查询拣货单信息
     */
    PickingVO getPickingInfo(String pickingCode);





    List<DeliveryVO> printExpress(String pickingCode);

    /**
     * 波次打印面单
     *
     * @param wavePickingCode
     * @return
     */
    List<DeliveryVO> wavePrintWaybill(String wavePickingCode);

    /**
     * 更新拣货单取消数量和状态
     * 取消数量+拣货数量+缺货数量=分配数量的时候拣货单状态为完成
     * @author liuxr
     * @date 2021/5/17 16:33
     * @param pickingCode
     * @param cancelQuantity
     * @return boolean
     */
    boolean updateCancelQuantityAndStatusByCode(String pickingCode, BigDecimal cancelQuantity);

    /**
     * 拣货确认更新拣货单拣货完成
     * @author liuxr
     * @date 2021/5/27 9:02
     * @param pickingCode
     * @return int
     */
    int updateCheckFinsh(String pickingCode,String groupCode);

    /**
     * 波次拣货缺货登记，更新拣货单登记明细拣货单明细缺货数量、拣货数量、状态
     * @author liuxr
     * @date 2021/6/8 9:10
     * @param wavePickingCode 波次号
     * @param oldInventoryCode 原始库存标识
     * @param refundQuantity 缺货数量
     */
    void updateItemsOutStockQuantity(String wavePickingCode, String oldInventoryCode, BigDecimal refundQuantity,String groupCode);

    /**
     * 查询预打包单拣货信息
     * @author rfwang
     * @date 2021年7月9日
     * @param pickingCode 拣货单号
     */
    PickingVO getPrepackagedPickingInfo(String pickingCode);

    /**
     * pda预打包确认
     *
     * @param pickingCode 拣货单号
     * @author rfwang
     * @date 2021年7月9日
     */
    PdaSwitchPageVO pdaPrepackagedCheck(String pickingCode);

    /**
     * pda预打包缺货登记
     *
     * @param wavePickingCode 波次号
     * @param deliveryDTOList 订单列表
     * @author rfwang
     * @date 2021年7月9日
     */
    PdaSwitchPageVO prepackagedStockout(String wavePickingCode, List<DeliveryDTO> deliveryDTOList,Integer planPickQuantity,Integer pickQuantity);

    /**
     * 预打包缺货按比例更新拣货主单、拣货明细、拣货登记表数量
     *
     * @param wavePickingCode  波次号
     * @param planPickQuantity 订单列表
     * @author rfwang
     * @date 2021年7月9日
     */
    void updatePrepackagedPicking(String wavePickingCode, Integer planPickQuantity, Integer pickQuantity);

    /**
     * 更新拣货单出库下发状态
     * @param wavePickingCode 波次号
     */
    void updateOutboundIssueStatus(String wavePickingCode, String groupCode);

    /**
     * 批量保存拣货单，拣货明细，拣货登记信息
     * @param pickingList
     * @param pickingItemList
     * @param pickingRegisterList
     */
    void savePickingsInfo( List<Picking> pickingList, List<PickingItem> pickingItemList, List<PickingRegister> pickingRegisterList);

    void validatePnInfo(String pickingCode,String goodsBarCode,String pn,String groupCode);

    /**
     *
     * @param wavePickingCode
     */
    void cancelWaveTips(String wavePickingCode);

    /**
     * 批量更新总检单打印次数
     * @param codes
     */
    void batchGeneralPickCount(List<String> codes);

    /**
     * 批量更新拣货单（序号）打印次数增加
     * @param codes
     */
    void batchPickSortCount(List<String> codes);

    /**
     * 根据波次号更新打印次数
     * @param wavePickingCode
     */
    void updatePrintCount(String wavePickingCode);

    /**
     * 拣货单容器号赋值
     * @param pickingCode
     * @param containerBarCode
     */
    void updatePickingContanerBarCode(String pickingCode,String containerBarCode);

    /**
     * 波次拣货，释放容器号 （注意：不是普通的容器）
     * @param wavePickingCode
     * @param groupCode
     */
    void releaseContainer(String wavePickingCode,String groupCode);

    /**
     * 获取拣货单详情(包含拣货序号)
     * @param code
     */
    PickingVO getItemWithOrderNum(String code);

    /**
     * 波次打印订单
     * @param wavePickingCode
     * @return
     */
    List<Delivery> wavePrinDelivery(String wavePickingCode);


    void updatePrintCountV(String wavePickingCode, String branchCode);
}
